package com.sky.service;

import com.sky.dto.*;
import com.sky.result.PageResult;
import com.sky.vo.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

public interface OrdersService {

    /**
     * 提交订单
     * @param ordersDTO
     *
     */
    @Transactional
    OrderSubmitVO submitOrders(OrdersSubmitDTO ordersDTO);

    /**
     * 订单支付
     * @param ordersPaymentDTO
     * @return
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 支付成功，修改订单状态
     * @param outTradeNo
     */
    void paySuccess(String outTradeNo);

    /**
     * 查询用户历史订单
     *
     * @param ordersPageQueryDTO
     * @return
     */
    PageResult pageOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 查看订单详情
     * @param id
     * @return
     */
    OrderVO getOrderById(Long id);

    /**
     *  取消订单   '订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款',
     * @param id
     */
    void updateStatusById(Long id) throws Exception;

    /**
     *  再来一单
     * @param id
     */
    void repetition(Long id);
    /**
     * 查询全部订单
     *
     * @param pageQueryDTO
     * @return
     */
    PageResult adminPageOrders(OrdersPageQueryDTO pageQueryDTO);

    /**
     * 各个状态的订单数量统计
     * @return
     */
    OrderStatisticsVO statistics();

    /**
     * 接单
     * @param id
     */
    void updateConfirmById(Long id);

    /**
     * 拒单
     *
     * @param rejectionDTO
     */
    void updateRejectionById(OrdersRejectionDTO rejectionDTO);

    /**
     * 业务规则：
     *
     * - 取消订单其实就是将订单状态修改为“已取消”
     * - 商家取消订单时需要指定取消原因
     * - 商家取消订单时，如果用户已经完成了支付，需要为用户退款
     * @param ordersCancelDTO
     */
    void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception;

    /**
     * 业务规则：
     *
     * - 派送订单其实就是将订单状态修改为“派送中”
     * - 只有状态为“待派送”的订单可以执行派送订单操作
     * @param id
     */
    void updateDelivery(Long id);

    /**
     * 订单完成
     * @param id
     */
    void updateComplete(Long id);

    /**
     * 客户催单
     * @param id
     */
    void reminder(Long id);

}
